/*--------------------------------------------------------------------------------------------------
Yatak Operation System Project Copyright 2012
Author : Ilya Churaev
Started : 17 Jun 2012		Updated : 17 Jun 2012
File Name : ordered_array.h	Purpose : Interface for creating, inserting and deleting from ordered arrays.
--------------------------------------------------------------------------------------------------*/
#ifndef _ORDERED_ARRAY_H
#define _ORDERED_ARRAY_H

#ifdef __cplusplus
extern "C" {
#endif

#include <types.h>

// Сортировка этого массива происходит при вставке элементов - он всегда будет
// отсортирован (между двумя последовательными к нему обращениями)
// В нем можно хранить все что угодно, тип хранящихся объектов определяется как
// void * поэтому можно хранить uint32 или какой-нибудь другой указатель.
typedef void* type_t;

// Предикат должен возвращать ненулевое значение в случае, если первый аргумент
// меньше, чем второй. В противном случае должно быть возвращено нулевое значение.
typedef sint8 (*lessthan_predicate_t)(type_t,type_t);
typedef struct
{
	type_t *array;
	uint32 size;
	uint32 max_size;
	lessthan_predicate_t less_than;
} ordered_array_t;

// Стандартный предикат less than (меньше чем)
sint8 standard_lessthan_predicate(type_t a, type_t b);

// Создание упорядоченного массива
ordered_array_t create_ordered_array(uint32 max_size, lessthan_predicate_t less_than);
ordered_array_t place_ordered_array(void *addr, uint32 max_size, lessthan_predicate_t less_than);

// Уничтожение упорядоченного массива
void destroy_ordered_array(ordered_array_t *array);

// Добавление элемента в массив
void insert_ordered_array(type_t item, ordered_array_t *array);

// Поиск элемента по индексу i
type_t lookup_ordered_array(uint32 i, ordered_array_t *array);

// Удаление из массива элемента расположенного по индексу i
void remove_ordered_array(uint32 i, ordered_array_t *array);

#ifdef __cplusplus
}
#endif

#endif
